package util

import (
	"fmt"
	"github.com/shopspring/decimal"
	"math"
	"strconv"
)

//FormatFloat64 将多余的浮点格式化
func FormatFloat64(f float64) string {
	return strconv.FormatFloat(f, 'f', -1, 64)
}

//FormatFloat32 将多余的浮点格式化
func FormatFloat32(f float32) string {
	return strconv.FormatFloat(float64(f), 'f', -1, 32)
}

// AddFloat64 精度加法 a+b
func AddFloat64(a *float64, b *float64) *float64 {
	if a == nil {
		return b
	}
	if b == nil {
		return a
	}
	r, _ := decimal.NewFromFloat(*a).Add(decimal.NewFromFloat(*b)).Float64()
	return &r
}

// AddFloat64Au 精度加法 a+b+c+....
func AddFloat64Au(a ...*float64) *float64 {
	var r *float64
	for i, f := range a {
		if i == 0 {
			r = f
		} else {
			r = AddFloat64(r, f)
		}
	}
	return r
}

// SubtractFloat64 精度减法 a-b
func SubtractFloat64(a *float64, b *float64) *float64 {
	if b == nil {
		return a
	}
	if a == nil {
		r, _ := decimal.NewFromFloat(-1).Mul(decimal.NewFromFloat(*b)).Float64()
		return &r
	}
	r, _ := decimal.NewFromFloat(*a).Sub(decimal.NewFromFloat(*b)).Float64()
	return &r
}

// SubtractFloat64Au 精度减法 a-b-c-....
func SubtractFloat64Au(a ...*float64) *float64 {
	var r *float64
	for i, f := range a {
		if i == 0 {
			r = f
		} else {
			r = SubtractFloat64(r, f)
		}
	}
	return r
}

// MultiplyFloat64 精度乘法 a*b
func MultiplyFloat64(a *float64, b *float64) *float64 {
	if a == nil || b == nil {
		return nil
	}
	r, _ := decimal.NewFromFloat(*a).Mul(decimal.NewFromFloat(*b)).Float64()
	return &r
}

// MultiplyFloat64Au 精度乘法 a*b*c*....
func MultiplyFloat64Au(a ...*float64) *float64 {
	var r *float64
	for i, f := range a {
		if i == 0 {
			r = f
		} else {
			r = MultiplyFloat64(r, f)
		}
	}
	return r
}

// DivideFloat64 精度除法 a/b
func DivideFloat64(a *float64, b *float64) *float64 {
	if a == nil || b == nil {
		return nil
	}
	r, _ := decimal.NewFromFloat(*a).Div(decimal.NewFromFloat(*b)).Float64()
	return &r
}

// DivideFloat64Au 精度除法 a/b/c/....
func DivideFloat64Au(a ...*float64) *float64 {
	var r *float64
	for i, f := range a {
		if i == 0 {
			r = f
		} else {
			r = DivideFloat64(r, f)
		}
	}
	return r
}

// YuanToFen 元转分
func YuanToFen(t float64) int64 {
	value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", *MultiplyFloat64(&t, Addr(float64(100)))), 64)
	return int64(value)
}

// FenToYuan 分转元
func FenToYuan(t int64) float64 {
	value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", *DivideFloat64(Addr(float64(t)), Addr(float64(100)))), 64)
	return value
}

// RoundOff 四舍五入，t为小数点位数
func RoundOff(f *float64, t int) *float64 {
	a := math.Pow10(t)
	b := *f
	d := math.Round(a*b) / a
	ff := "%." + strconv.Itoa(t) + "f"
	value, _ := strconv.ParseFloat(fmt.Sprintf(ff, d), 64)
	return &value
}
